/**
 * 构造树型结构数据
 * @param {*} source 数据源
 * @param {*} id id字段 默认 'id'
 * @param {*} parentId 父节点字段 默认 'parentId'
 * @param {*} children 孩子节点字段 默认 'children'
 * @param {*} rootId 根Id 默认 0
 */
export function treeData(source, id, parentId, children, rootId) {
  id = id || 'id'
  parentId = parentId || 'parentId'
  children = children || 'children'
  rootId = rootId || 0
  const cloneData = JSON.parse(JSON.stringify(source)) // 对源数据深度克隆
  return cloneData.filter(father => {
    const branchArr = cloneData.filter(child => father[id] === child[parentId]) // 返回每一项的子级数组
    branchArr.length > 0 ? (father[children] = branchArr) : delete father[children] // 如果存在子级，则给父级添加一个children属性，并赋值
    return father[parentId] === rootId // 返回第一层
  })
}

/**
 * 构造树型结构数据
 * @param {*} source 数据源
 * @param {*} id id字段 默认 'id'
 * @param {*} pid 父节点字段 默认 'pid'
 * @param {*} children 孩子节点字段 默认 'children'
 * @param {*} rootId 根Id 默认 -1
 */
export function TabtreeData(source, id, pid, children, rootId) {
  id = id || 'id'
  pid = pid || 'pid'
  children = children || 'children'
  rootId = rootId || -1
  const cloneData = JSON.parse(JSON.stringify(source)) // 对源数据深度克隆
  return cloneData.filter(father => {
    const branchArr = cloneData.filter(child => father[id] === child[pid]) // 返回每一项的子级数组
    branchArr.length > 0 ? (father[children] = branchArr) : delete father[children] // 如果存在子级，则给父级添加一个children属性，并赋值
    return father[pid] === Number(rootId) // 返回第一层
  })
}

/**
 * 树形结构中查找指定目标ID的所有父级ID
 * @param {Array} tree - 树形结构数据的根节点数组
 * @param {String} id - 树节点中表示唯一标识的键名，默认为'id'
 * @param {String|Number} targetId - 需要查找的目标节点的ID
 * @param {Array} parentId - 用于存储遍历过程中的父级ID，默认为空数组
 * @returns {Array} 返回包含所有父级ID的数组，如果未找到目标ID，则返回空数组
 */
export function findParentIds(tree, id = 'id', targetId, parentId = []) {
  for (let node of tree) {
    if (node[id] === targetId) {
      parentId.push(node[id])
      return parentId
    }

    if (node.children && node.children.length > 0) {
      const foundParents = findParentIds(node.children, id, targetId, parentId.concat(node[id]))

      if (foundParents.length > parentId.length) {
        return foundParents
      }
    }
  }

  return []
}
